#coding:utf-8
from rest_framework import viewsets
from erp_system.models import PermissionsModel,RolesModel

from MSB_ERP.apps.erp_system.serializer.Permissions_Serializer import PermissionsSerializer
from rest_framework.decorators import action
from rest_framework.response import Response

from MSB_ERP.utils.base_views import MultipleDestroyMixin


class PermissionsView(viewsets.ModelViewSet,MultipleDestroyMixin):
    """
     create :
    新增权限,



    retrieve:
    查询当个权限

    list:
    查询所有的


    update:
    修改权限，修改权限本身的属性

    partial_update:
    局部修改权限，修改任意指定的属性

    destroy:
    删除指定的单个权限

    find_Permissions_by_menu
    查询属于指定菜单或者接口的权限列表，需要传参：menu_id,比如：/find_Permissions_by_menu ?menu_id=2
    """

    queryset =PermissionsModel.objects.all()
    serializer_class = PermissionsSerializer

    @action(methods=['get'],detail=False)
    def find_Permissions_by_menu(self,request,*args,**kwargs):
        menu_id=request.query_params.get('menu_id')
        permissions_list=PermissionsModel.objects.filter(menu__id=menu_id).all()
        #序列化

        ser = PermissionsSerializer(instance=permissions_list, many=True)
        return Response(ser.data)

    @action(methods=['get'], detail=False)
    def find_Permissions(self, request, *args, **kwargs):
        #返回当前角色的所有已经拥有的权限ID列表，以及ERP系统中所有的权限（树形）数据
        result={}#返回整个字典
        rid=request.query_params.get('rid',None)
        if rid:
            #查询当前角色的已经拥有的权限ID列表
            ids=RolesModel.objects.filter(id=rid).values_list('permissions',flat=True).distinct()#distinct去重，返回列表permissions字段，flat扁平化
            result['ids']=ids#把已经授权的ID列表存入返回字典中
        #查询整个ERp系统所有的权限列表，要求树形展示
        permission_list=PermissionsModel.objects.values('id','name','menu__name','menu__id','menu__parent__id')
        tree_dict={}#表示一个父节点
        tree_data=[]#整个权限的树形数据，数据在字典里，字典在大的列表里，在列表里把字典整成树形

        #第一步构建一个二级树
        for item in permission_list:
            tree_dict[item['menu__id']]=item
        for i in tree_dict:
            if tree_dict[i]['menu__parent__id']:#这是子菜单（二级）
                pid=tree_dict[i]['menu__parent__id']
                parent=tree_dict[pid]
                child=dict()
                child['menu__id']=tree_dict[i]['menu__id']
                child['menu__name']=tree_dict[i]['menu__name']
                child.setdefault('permissions',[])#setdefault默认是，名字是permissions，是列表
                #把当前子菜单（二级），关联到父菜单
                parent.setdefault('children',[]).append(child)

            else: #所有的父菜单（一级）
                tree_data.append(tree_dict[i])
        #第二步：在前面二级树形结构的基础上，添加子权限
        for parent in tree_data:
            if 'children' in parent:
                for child in parent['children']:
                    #得到child(二级)
                    for node in permission_list:
                        if node['menu__parent__id'] and node['menu__id'] == child['menu__id']:
                            child['permissions'].append(node)
        result['tree_data']=tree_data
        return Response(result)





































